﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;//线程命名空间


//内部封装一个Socket   对外提供简单的发送和接收消息的方法
class Connecter
{
    Socket socket;//用于通信的Socket 
    public Connecter(Socket socket)
    {
        this.socket = socket;
        Thread thread = new Thread(Recive);//创建新线程
        thread.Start();
    }

    //发消息
    public void Send(string msg)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(msg);  //编码
        socket.Send(bytes);//发送
    }

    //接收消息 运行再新线程中
    public void Recive()
    {
        byte[] arr = new byte[1024];//1KB缓冲区
        while (true)
        {
            try //当客户端异常掉线会引发异常
            {
                int legth = socket.Receive(arr);//返回值表示实际收到的数据的长度,没有消息的时候阻塞线程,本质是从底层缓冲区拿数据
                if (legth == 0)//如果客户端调用Close关闭Socket会不断收到0长度的消息
                {
                    Console.WriteLine("客户点下线:" + socket.RemoteEndPoint);
                    break;
                }
                Console.WriteLine(Encoding.UTF8.GetString(arr, 0, legth));//解码并输出
            }
            catch (Exception)
            {
                Console.WriteLine("客户点掉线:" + socket.RemoteEndPoint);
                break;
            }
        }
    }
}
